<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>ThreadLocal使用</title>
    <style>
        body {
            background-color: #c7edcc
        }
    </style>
</head>
<body>
<pre>

    曾经被问到使用过ThreadLocal,问假如线程挂了会不会造成内存泄露?
    当时回答说不会,下来看了下源代码和在网上查找了些资料,现记录下:

    以前使用ThreadLocal来实现对象池,将ThreadLocal作为一个全局静态变量,每个线程都有一个对象集合,用的时候直接检查该集合中的对象状态,
    在多线程情况下不用使用同步锁住对象池.

    当某个线程挂掉了,按道理应该释放线程对应的对象集合,java就是这么干的.

    阅读源代码:
        从ThreadLocal对象调用set get方法,方法内部首先获得当前线程,然后访问线程对象的ThreadLocalMap,如果为空就创建一个,实际上ThreadLocal
    自身是不存储值的,而是ThreadLocalMap存储值, ThreadLocalMap内部的Entry采用弱引用实现,当线程挂掉,没有强引用指向ThreadLocalMap,Entry是个
    弱引用对象,当只有弱引用指向该Entry时,当进行垃圾回收时可以回收掉该对象.所以线程挂掉了不会导致内存泄露.


    还有一种需要在一个线程中存储多个本地变量,可以新建多个ThreadLocal对象,最终ThreadLocal会作为ThreadLocalMap的key,用来查找线程本地变量.
    如果使用了线程池,没次使用都新建一个ThreadLocal设置一个线程本地变量,当这个线程被归还给池后,再次解出来设置线程本地变量,ThreadLocal的set
    方法会检查线程map中key为null的Entry,将会清理掉Key为空的Entry

    http://www.cnblogs.com/onlywujun/p/3524675.html
</pre>
</body>
</html>